﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class IdiomaUsuario
    {
        public static List<IdiomaUsuario> Listar(IdiomaUsuario idiomaUsuario)
        {
            if (idiomaUsuario == null)
                idiomaUsuario = new IdiomaUsuario();
            var context = new DataAccess.SistemaCurricularEntities();
            var lista = context.IdiomaUsuario.Where(a => 
                    (idiomaUsuario.UsuarioId == 0 || a.UsuarioId == idiomaUsuario.UsuarioId) &&
                    (idiomaUsuario.IdiomaId == 0 || a.IdiomaId == idiomaUsuario.IdiomaId) &&
                    (idiomaUsuario.Nivel == null || idiomaUsuario.Nivel == "" || a.Nivel == idiomaUsuario.Nivel)
                ).ToList().Select(s => idiomaUsuario.Create(s)).ToList();
            return lista;
        }

        public long UsuarioId { get; set; }

        public int IdiomaId { get; set; }

        public Idioma Idioma { get; set; }

        public string Nivel { get; set; }

        public bool IsNew { get { return Listar(new IdiomaUsuario { IdiomaId = this.IdiomaId, UsuarioId = this.UsuarioId} ).Count == 0;} }

        internal Lib.IdiomaUsuario Create(DataAccess.IdiomaUsuario model)
        {
            if (model == null)
                return null;
            var item = new Lib.IdiomaUsuario();
            item.UsuarioId = model.UsuarioId;
            item.IdiomaId = model.IdiomaId;
            item.Nivel = model.Nivel;
            if (model.Idioma != null)
                item.Idioma = new Idioma().Create(model.Idioma);
            return item;
        }

        public bool Salvar()
        {
            var retorno = false;
            Transaction.Begin(context =>
            {
                DataAccess.IdiomaUsuario model = null;
                if (this.IsNew)
                    model = this.Insert(context);
                else
                    model = this.Update(context);
                this.IdiomaId = model.IdiomaId;
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {
            });
            return retorno;
        }

        private DataAccess.IdiomaUsuario Insert(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            context.AddToIdiomaUsuario(item);
            return item;
        }

        private DataAccess.IdiomaUsuario Update(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            return item;
        }

        private DataAccess.IdiomaUsuario CreateModel(DataAccess.SistemaCurricularEntities context)
        {
            DataAccess.IdiomaUsuario item = null;
            if (this.IsNew)
                item = new DataAccess.IdiomaUsuario();
            else
            {
                item = context.IdiomaUsuario.FirstOrDefault(f => f.IdiomaId == this.IdiomaId && f.UsuarioId == this.UsuarioId);
                if (item == null)
                    throw new Exception("Código de idioma e usuário inválido");
            }
            item.UsuarioId = this.UsuarioId;
            item.Nivel = this.Nivel ?? string.Empty;
            item.IdiomaId = this.IdiomaId;
            return item;
        }

        public bool Excluir()
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                context.IdiomaUsuario.DeleteObject(this.CreateModel(context));
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {

            });
            return retorno;
        }
    }
}
